home *** CD-ROM | disk | FTP | other *** search
/ Chip 1996 April / CHIP 1996 aprilis (CD06).zip / CHIP_CD06.ISO / hypertxt.arj / 92 / CXX.CD < prev    next >
Text File  |  1995-09-12  |  36KB  |  621 lines

  1.       @VBjarne Stroustrup: Termékeny úton a C++ felé@N
  2.  
  3.           Egy  új  szoftver  nem  csupán  technikai  ügy,  hanem a
  4.       felhasználó munkakultúráját is érinti. Bjarne Stroustrup,  a
  5.       C++ objektumorientált  programozási nyelv  alkotója tippeket
  6.       nyújt az új programozási stílus ""csendes" bevezetésére.
  7.           Szeretnénk  Önöknek  képet adni  arról,  hogyan lehet  a
  8.       C++-t produktívan bekapcsolni  a munkánkba és  felhasználni.
  9.       Némiképp azt is szeretném elérni, hogy eloszoljék a C++-t és
  10.       általában az objektumorientált programozást körülvevô köd és
  11.       misztikum. Az  alábbiakban a  nyelv leírását,  amint az  itt
  12.       látható,  a  C++  elsajátítására  rendszerint  ajánlott  mód
  13.       követi:  elôször  egy jobb  C,  aztán adatabsztrakció,  majd
  14.       objektumorientált programozás.
  15.           A  C++-t,  mint  programozási  eszközt  a   legszélesebb
  16.       értelemben  vett  rendszerprogramozás  számára fejlesztettük
  17.       ki. Természetesen más  célokra is fel  lehet használni --  a
  18.       koncepció  általános  és   a  C++-t  nem   zárt  rendszernek
  19.       tervezték.
  20.           Ha  mindazonáltal  valakitôl  azt  hallják,  hogy  olyan
  21.       nyelvet  vagy  valami olyan  eszközt  talált, amely  könnyen
  22.       megoldja az  Önök összes  problémáját, akkor  ne higgyék  el
  23.       neki. Nincsenek csodák, nincs mindenható orvosság. Semmi sem
  24.       pótolhatja a gondolkozás kemény munkáját.
  25.           A gondokodás annál komolyabb feladatot tûz elénk,  minél
  26.       jobbak  az  általunk  alkalmazott  eszközök.   Természetesen
  27.       kielégítô, ha oldalakon keresztül assembly kódokat írunk, de
  28.       az efféle kielégüléstôl meg van fosztva egy magasabb  szintû
  29.       nyelv     programozója.     Most     határozottabban    kell
  30.       elgondolkoznunk azon, hogy tulajdonképpen mit is  csinálunk.
  31.       Szükségünk   van  intelligenciára,   tapasztalatokra  és   a
  32.       kvalifikált  munka  legkevésbé  mérhetô  jellemvonására:  az
  33.       ízlésre.
  34.           Ahhoz,  hogy  érthetôvé  tegyem, mi  is  a  C++, elôször
  35.       alapvetô gondolatokat  akarok megfogalmazni  arról, hogy  mi
  36.       egy  program,  és  egy  nyelvnek  mit  kellene  nyújtania  a
  37.       programozó számára.
  38.           Ha  az  ember  programot ír,  akkor  a  valóság egyfajta
  39.       modelljét készíti  el. Egy  olyan behatárolt  modellt, amely
  40.       már csak az adott probléma lényegesnek tartott  szempontjait
  41.       tartalmazza.  Azt  hiszem,   ez  az  a   gondolat,  amelynek
  42.       megvalósítását az objektumorientált programozás kitûzte maga
  43.       elé, és amely körül az egész programozás forog.
  44.           A  kulcsgondolat   a  következô:   ha  probléma   van  a
  45.       programmal,  akkor   nem  a   számítástechnika  trükktárában
  46.       kellene   keresgélni,   hanem  meg   kellene   próbálni  jól
  47.       megfigyelni a modellizált  tevékenységet, azaz a  valóságot,
  48.       és aztán  alkalmas módot  találni a  probléma programszinten
  49.       való leírására.
  50.           Ha  ebbôl a  látásmódból indul  ki az  ember, akkor  mit
  51.       nyújthat  egy programozási  nyelv erre  a célra?  Lényegében
  52.       segíthet a dolgokat közvetlenül megjeleníteni a programban.
  53.           A   programozás   területén   eddig   elért   legnagyobb
  54.       elôrelépés a Fortran bevezetése volt, ami alapjában véve  az
  55.       aritmetikát tükrözte vissza. Ahelyett, hogy adatokat kellene
  56.       fáradságos módon  regiszterbe tölteni,  majd a  regiszterhez
  57.       más értékeket  hozzáadni és  az eredményt  egy másik  helyen
  58.       tárolni, valójában egyszerûen azt írhattuk, hogy @KA = B + C@N.
  59.           Ez   bizonyos   tekintetben   minden   magasabb   szintû
  60.       programozási   nyelv   lényeges   jellemvonása.   Szeretnénk
  61.       továbbra is folytatni ezt az utat.
  62.           Ennek egyik elsô példája  egy munka John Bentley-tôl  és
  63.       Brian Kernighan-tôl.  Programnyelvet terveztek  molekulákkal
  64.       foglalkozó emberek  számára. Volt  egy tankönyvük,  amelybôl
  65.       megtudták, hogyan néz  ki egy molekula,  hová illenek be  az
  66.       atomok, és milyen  a térbeli elrendezôdésük.  Végeredményben
  67.       be  lehetett adni  egy képletet  a tankönyv  alapján, és  --
  68.       csodák  csodája  -- egy  piros-zöld  szemüvegen keresztül  a
  69.       molekulák három dimenzióban láthatóvá váltak a képernyôn.
  70.           Mindazonáltal az olyan programnyelvek, amelyek  lehetôvé
  71.       teszik   egy   adott   alkalmazási   terület   koncepcióinak
  72.       közvetlenül programban  való kifejezését,  e példájának  van
  73.       egy súlyos hiányossága:  nem használható fel  általánosan. E
  74.       technika csak  a fizikai  kémia egy  speciális részterületén
  75.       mûködik. És minden speciális esetben is csak akkor  mûködik,
  76.       ha olyan emberekhez fordulhatunk, mint Bentley és Kernighan.
  77.       Rendszerint  nem  ez a  helyzet,  és még  ha  így is  lenne,
  78.       valószínûleg  akkor   sem  lehetne   hosszabb  távon   ilyen
  79.       embereket alkalmazni.
  80.  
  81.  
  82.       @VKözvetlen kifejezések@N
  83.  
  84.           Ezért ugyanezzel a gondolattal foglalkozom, de úgy, hogy
  85.       megfizethetô  legyen  --  részben  azáltal,  hogy  általános
  86.       eszközöket bocsájtunk  rendelkezésre a  koncepciók közvetlen
  87.       leképezésére,  részben  azáltal,  hogy  a  C++-t  a szokásos
  88.       gépeken   elôforduló    általános   problémák    megoldására
  89.       fejlesztettük ki.  Ugyanis vannak  olyan problémák,  amelyek
  90.       esetében a következô  kompromisszumot lehet kötni:  szerzünk
  91.       egy olyan programozási rendszert, amely megkönnyíti a dolgok
  92.       közvetlen  formában  való  kifejezését,  de  ennek  során az
  93.       irányítási munkák felemésztik a CPU teljesítményének  90--95
  94.       százalékát.  Az  efféle  kompromisszumot  elfogadhatatlannak
  95.       tartom.
  96.           Vizsgáljuk  meg  alaposabban  a  C++-hoz  vezetô   utat.
  97.       Elôször elkezdjük a C++-t többé-kevésbé tökéletesebb  C-ként
  98.       alkalmazni. Könnyen kitûnik, hogy egy C++ program futását  a
  99.       C és a C++ közös részhalmazán belül csekély mértékben  lehet
  100.       meggyorsítani egy C programhoz  képest. Ennek oka a  típusok
  101.       szigorúbb  ellenôrzése  a  függvények  meghívásakor.  Ez nem
  102.       jelenti  azt,  hogy   bármely  speciális  compiler   valóban
  103.       gyorsabban  fut.  Azonban  azt igen,  hogy  a  C++-ban nincs
  104.       szisztematikus  overhead.  A  C++  99,9%-ig  kompatibilis  a
  105.       C-vel. Száz százalékig sosem lehetne, mert az  ellentmondana
  106.       a típusellenôrzés  alapelvének. A  C++ nagymértékben  függ a
  107.       típusok  állandó   ellenôrzésétôl.  Ez   az  oka   a  kisebb
  108.       inkompatibilitásoknak.  De  ahhoz  afféle   ""nyelvtudósnak"
  109.       kellene lenni, hogy megtaláljuk azokat.
  110.           A ""tökéletesebb C"  elônyei közé tartozik  elsôsorban a
  111.       típusellenôrzés --  ez lehetôvé  teszi a  munka idôben  való
  112.       elkészítését, s ugyanakkor újat tanul az ember.
  113.           Az    emberek   többnyire    gyorsan   hozzáláttak    új
  114.       adattípusokat   tervezni   --   néhány  alkalmazásspecifikus
  115.       típust.   Elvileg  ekkor   az  adatabsztrakció   látásmódját
  116.       használják, ami nem különösebben bonyolult. Egy új adattípus
  117.       koncepcionálisan   beleillik   a   beépített  adattípusokról
  118.       alkotott  megszokott  gondolkodásmódba.  Ezenkívül  az ember
  119.       learatja a C++ összes paradigmájának minden elônyét, mivel a
  120.       könyvtárak  profitálnak  abból, hogy  az  önállóan definiált
  121.       adattípusokat   a   programozó   beépített   adattípusokként
  122.       használhatja   anélkül,   hogy   meg   kellene   értenie  az
  123.       implementáció specifikus részleteit.
  124.           A  C++   betanulásának  elsô   féléve  során   elvben  a
  125.       következôket ajánljuk:  az embernek  fel kellene  hagynia az
  126.       objektumorientált programozással,  a kategóriák  egymás fölé
  127.       rendelésével  és  a  típusfák  készítésével.  Elôször  hozzá
  128.       kellene  szoknia   a  szigorúbb   típushasználathoz  és   az
  129.       adatabsztrakcióhoz. Mindenkit hagyni kellene a saját tempója
  130.       szerint tanulni.
  131.           Minden  átálló  sikeres volt,  aki  követte e  tanácsot.
  132.       Azaz,  ha  az  embernek egy  fél  évvel  késôbb van  leadási
  133.       határideje, akkor a javasolt módon ennek ellenére áttérhet a
  134.       C++-ra,  és még  elônyöket is  szerezhet abból  a  következô
  135.       feladathoz.
  136.  
  137.  
  138.       @VA fluktuáció költségei@N
  139.  
  140.           Miért kellene tekintettel  lenni a dolgozókra?  Biztosan
  141.       vannak olyan menedzserképzô-iskolák, ahol azt tanítják, hogy
  142.       fel kell venni a legolcsóbb programozókat, ki kell  facsarni
  143.       ôket, majd a feladat végrehajtása után ki lehet ôket  dobni.
  144.       Mondhatnánk,  hogy ez  nem tisztességes,  ezért nem  kellene
  145.       ilyet csinálni --  de egy hétpróbás  menedzsert ez nem  gyôz
  146.       meg. Az efféle irányításnak igen nyomós oka van: a pénz.
  147.           Azonban ha  alkalmazzuk a  legolcsóbb programozókat,  és
  148.       kifárasztjuk ôket, akkor minden hanyagul lesz elvégezve.  Az
  149.       emberek, amint lehet, új állást keresnek. Természetesen csak
  150.       a legjobb  programozók mennek  el, hiszen  ôk kapnak munkát.
  151.       îgy  jutunk  el  a fluktuáció  költségeihez.  Ha  nem bánunk
  152.       tisztességesen a dolgozókkal, akkor nem fogják idejüket abba
  153.       fektetni, hogy  új technikákat  tanuljanak meg.  Nem lesznek
  154.       képesek  válaszolni  az új  kihívásokra.  Egyáltalán nem  is
  155.       fogják azokat észrevenni.
  156.           Az  USA-ban fennáll  egy komoly  probléma, különösen  az
  157.       olyan  helyeken  mint  a  Szilícium-völgy,  ahol  a dolgozók
  158.       évente vagy még  gyakrabban változtatják munkahelyüket:  nem
  159.       akarnak  olyan  képességeket elsajátítani,  amit  nem tudnak
  160.       felhasználni következô munkájuk során. Ez a hozzáállás és az
  161.       a   vezetôi   hozzáállás,   miszerint   ""Használjuk   ki  a
  162.       programozókat  amilyen  gyorsan  csak  lehet,  mivel   úgyis
  163.       elmennek", hosszabb távon visszaüt.
  164.           Térjünk  vissza  a  programozási  nyelvek  problémáihoz.
  165.       Bizonyára észrevették,  hogy egész  idô alatt  megkíséreltem
  166.       párhuzamot vonni a technológiai és a szociológiai  problémák
  167.       között.  A  technikai  megoldásokat  nem  egy   szociológiai
  168.       problémára  lehet  alkalmazni és  viszont.  És a  szoftverek
  169.       fejlesztése  magában  foglalja  mind  az  embereket,  mind a
  170.       gépeket  és  a  nyelveket.  Összességében  sajnos hajlamosak
  171.       vagyunk arra, hogy elfelejtkezzünk az emberekrôl.
  172.  
  173.  
  174.       @VHogyan segíti a C++ az adatabsztrakciót?@N
  175.  
  176.           Az adatabsztrakció alapjában  véve úgy magyarázható  el,
  177.       mint egy olyan gondolat, amely a programozás folyamatát  két
  178.       részre bontja. Elôször  tervezünk egy bôvített  programozási
  179.       nyelvet,  amely  tartalmazza  azokat  a  típusokat,  amelyek
  180.       reprezentálják az alkalmazási terület alapkoncepcióit. Aztán
  181.       konkretizáljuk  a  típusokat, és  azokkal  programozunk. Más
  182.       szavakkal: felépítünk egy típusokból álló világot, és  abban
  183.       programozunk -- ahelyett, hogy egyszerûen nekilátnánk, és  a
  184.       kódokat bitek és byte-ok formájában beírnánk.
  185.           Ha   közvetítô   elrendezésekkel   foglalkozunk,   akkor
  186.       szeretnénk     közvetítô     szerkezeteket,     vezetékeket,
  187.       fôvezetékeket,  választási puffereket  és hasonló  dolgokat.
  188.       Alapvetôen azzal kezdjük,  hogy megemeljük a  nyelv szintjét
  189.       azáltal, hogy új típusokat tervezünk.
  190.           Ha sikerül  a típusvilág  megtervezése, akkor  a további
  191.       programozás minden résztvevô számára kellemes munka lesz.
  192.           Ha azonban a felhasználó által definiált  adattípusokból
  193.       áttekinthetetlen    összevisszaságot    csinálunk,     akkor
  194.       kutyaszorítóba kerülünk. Ahogy már mondtam, nincs mindenható
  195.       orvosság. Az ember kénytelen használni a fejét.
  196.           Amit   nem   szabad    figyelmen   kívül   hagynunk    a
  197.       programnyelvek produktivitásáról folytatott vitában, és  ami
  198.       hosszú  távon  döntôen  meghatározza  a  produktivitást:  az
  199.       emberek  egy  nyelvet használnak.  A  nyelv bármely  kultúra
  200.       meghatározó  eleme.  Nemcsak  arról  van  szó,  hogy  milyen
  201.       tulajdonságokkal bír egy nyelv, hanem arról is szó van, hogy
  202.       milyen további eszközök állnak a programozó  rendelkezésére,
  203.       milyen  a  programkönyvtárak  minôsége,  milyen  szintûek és
  204.       milyen jellegûek a  szakfolyóiratok, a tankönyvek,  a képzés
  205.       és a  továbbképzés. És  nem utolsósorban:  miképp folyik  az
  206.       információcsere?
  207.           Minden nyelv kiépíti a saját kultúráját. Remélem, hogy a
  208.       C++ kultúrája  vonzó --  hiszen a  teljes kultúra fontosabb,
  209.       mint  a nyelv  egyetlen ismertetôjegye.  Lényeges, hogy  egy
  210.       nyelvet hogyan lehet használni  a valós világban. Ez  erôsen
  211.       függ az emberektôl és az általuk létrehozható kultúrától.
  212.           A C++ bevezetésében az  elsô lépés megtétele és  az elsô
  213.       félév  eltelte  után   megállapíthatjuk,  hogy  az   emberek
  214.       valamennyit megértettek és  megtanultak, mégpedig nemcsak  a
  215.       leírt  kódokat,  hanem  többet:  ráhangolódtak  a kultúrára.
  216.       Elolvastak pár  tankönyvet. Szabadidejükben  játszadoztak az
  217.       objektumorientált programozással -- megértették az elveket.
  218.           Ezután az  idôszak után,  amely alatt  elsajátítottuk az
  219.       alapokat, merészebbek lehetünk, és elônyökre tehetünk  szert
  220.       a  C++  objektumorientált   tulajdonságai  révén.  Arról   a
  221.       megfigyelésrôl van szó, hogy a koncepciók nem elszigeteltek,
  222.       következésképpen az alkalmazás számára tervezett típusok sem
  223.       lehetnek függetlenek egymástól.
  224.           A C++ egyik sajátossága, hogy az új nyelv  megtanulására
  225.       fordított erôfeszítéseinket eloszthatjuk hosszabb idôre,  és
  226.       egyidejûleg produktívak maradunk. Ez azzal kapcsolatos, hogy
  227.       a nyelvek tervezését nem olyasvalaminek tartom, amit  tiszta
  228.       elvek alapján lehetne csinálni. Ugyan elvekbôl és  általános
  229.       gondolatokból  kell kiindulnunk,  de egyidejûleg  figyelembe
  230.       kell   vennünk   a    tényleges   korlátokat,   amelyek    a
  231.       képzettségbôl, a gép  teljesítményébôl stb. és  elsôsorban a
  232.       meglévô tapasztalatokból adódnak.
  233.           Az   objektumorientált    programozás   egyik    fô   --
  234.       valószínûleg   a   legrégebbi   --   problémája   (a  Simula
  235.       programozási nyelvet tervezô norvégektôl átvéve):  programot
  236.       írtak   egy   város   szimulálására,   amelyben   elemzik  a
  237.       közlekedést.   Olyan  tárgyaink   vannak,  mint   teherautó,
  238.       gépkocsi,  mentôautó,  tûzoltóautó stb.  Ha  egyszerûen csak
  239.       egyetlen  teherautó-típust,  egyetlen  autótípust,  egyetlen
  240.       tûzoltóautó-típust  írunk  le,   akkor  sok  típust   kapunk
  241.       struktúra nélkül.
  242.           A   koncepciót   nem    ültették   közvetlenül   át    a
  243.       programnyelvbe, mivel valami  elveszett. Elveszett annak  az
  244.       általánosítása  és  absztrakciója,  hogy  ezek   mindannyian
  245.       gépjármûvek.
  246.           Ezért olyan nyelvi jegyre van szükségünk, amely lehetôvé
  247.       teszi,  hogy   a  rokon   koncepciókat  általános   formában
  248.       jeleníthessük  meg.  Ez  a  gondolat  gyakorlatilag  spontán
  249.       fejlôdött ki abból az elképzelésbôl, hogy az, amit  teszünk,
  250.       kísérlet   arra,   hogy   a   valóság   elemzésébôl  leszûrt
  251.       koncepciókat adattípusokban képezzük le.
  252.           Az ehhez szükséges  alapvetô elképzelés egy  felhasználó
  253.       által  definiált  adattípus: el  kell  döntenünk, hogy  mely
  254.       típusokra van szükségünk, és  egy teljes mûveletsort kell  a
  255.       saját kezûleg tervezett típusok rendelkezésére bocsájtani.
  256.           Ez az  ideális adatabsztrakció.  Az effajta  programozás
  257.       számos  problémát  megold.  Ez  magában  foglalja  az adatok
  258.       elrejtését és az eljárásokban (procedúra) való programozást.
  259.           Most be fogok mutatni egy példát, amelyben összeomlik ez
  260.       az    ideál.    Aztán   elmagyarázom    az    ezen   túllépô
  261.       objektumorientált technikákat.
  262.  
  263.  
  264.       @VTúl az adatabsztrakción@N
  265.  
  266.           Ha   kizárólag   eljárásokra   van   szükségünk,   akkor
  267.       természetesen eljárásokban kell programoznunk; ha  kizárólag
  268.       modulokra, akkor maradhatunk  a moduláris programozásnál  és
  269.       az adatok elrejtésénél; ha kizárólag független adattípusokra
  270.       van szükségünk,  akkor elegendô  az adatabsztrakció.  Amirôl
  271.       azonban  most   beszélni  akarok:   mikor  omlik   össze  az
  272.       adatabsztrakció  koncepciója? Mikor  van szükségünk  további
  273.       lehetôségekre, és melyek ezek a lehetôségek?
  274.           Az itt fennálló probléma tulajdonképpen régi keletû,  és
  275.       már le van írva a ""Simula Begin" címû könyvben. A  probléma
  276.       eredeti változatában plotterekrôl volt szó. Elvben  egyfajta
  277.       grafikus rendszerrôl van szó, amelyben egy absztrakt formára
  278.       mutató  pointerre   van  szükségünk,   amit  --   a  konkrét
  279.       helyzettôl függôen -- valamiképp manipulálni lehet.
  280.           Tehát nem kell  azt mondani: ha  a kívánt forma  például
  281.       egy háromszög, akkor forgasd  el úgy, ahogy a  háromszögeket
  282.       forgatni   szokás...   Szeretnénk   megkímélni   magunkat  a
  283.       részletektôl.
  284.           Most   nézzünk  meg   egy  olyan   megoldást,  amit   az
  285.       adatabsztrakció hagyományos  stílusú megoldásának  neveznék.
  286.       Szükségünk van egy felhasználó által definiált  adattípusra,
  287.       hogy  ábrázolhassuk  egy  forma  koncepcióját.  Tudjuk, hogy
  288.       minden formának  van közepe  és színe,  és tudjuk  azt, hogy
  289.       milyen  mûveleteket  akarunk  végezni  rajta.  Eddig  minden
  290.       rendben. Azonban  a legkülönbözôbb  formák léteznek:  hogyan
  291.       ábrázoljuk   ôket?   Gondolhatnánk   arra,   hogy   egyetlen
  292.       megjelenítést használunk minden  forma számára, például  egy
  293.       pontokból álló láncolatot. Azonban  ez nem mûködik túl  jól:
  294.       valójában hány  pontból áll  egy kör?  A formák  esetében --
  295.       miként  a  legtöbb  más példában  --  nem  létezik egyetlen,
  296.       kézenfekvô   megjelenítés  a   koncepció  összes   változata
  297.       számára.
  298.           Ezért  megvalósításához  egyfajta  union-t, tag-union-t,
  299.       variant record-ot, vagy bárminek is nevezzük, használunk fel
  300.       @K(olyan adatstruktúrára utal, amely több részbôl áll, s  ezek
  301.       közt van  olyan, amelynek  típusa többféle,  a program adott
  302.       helyein tekinthetjük ilyen típusúnak is, olyan típusúnak is;
  303.       továbbiakban: variáns rekord -- a szerk.)@N. Ebben  szükségünk
  304.       van  arra  a lehetôségre,  hogy  leírhassuk, milyen  típusok
  305.       vannak. Tehát beépítünk egy típusleíró mezôt. Ezután  elvben
  306.       sokirányú  elágazásokból  (C-ben:  @Kswitch-@N,  más  nyelvekben
  307.       @KCASE-struktúrákból@N)  álló  egyetlen,  hatalmas szerkezetként
  308.       leírjuk a  típushoz szánt  mûveleteket. A  kód ezáltal ilyen
  309.       parancsokkal lesz tele, mint: rajzolj egy formát -- ha  kör,
  310.       akkor tedd ezt,  ha háromszög, akkor  tedd azt stb.  A dolog
  311.       mûködik. Azonban néhány komoly problémát vet fel.
  312.           Képzeljük el, hogy  van egy kis  grafikus szoftverházam.
  313.       Tegyük fel, hogy Ön vásárolt tôlem egy grafikai csomagot. Ön
  314.       azt szeretné, hogy a  grafikus csomaghoz hozzáfûzzek egy  új
  315.       formát, mondjuk a  cégemblémáját. Én azt  mondom: ""Rendben,
  316.       adjon nekem 10 ezer márkát, és beillesztem a cégemblémáját a
  317.       rendszerbe."  Ez  ugyanis  azt  jelenti,  hogy  minden olyan
  318.       függvényt módosítanunk kell, amely függ a típus-mezôtôl.
  319.           Ön erre  azt mondja:  ""Tízezer márka?!  Önnek elment az
  320.       esze! Ez a módosítás egészen egyszerû feladat". Én erre  azt
  321.       válaszolom: ""Ez igaz,  de megtehetem, hogy  nem adom oda  a
  322.       forráskódot.  Az  üzletem  ugyanis ezen  a  kiváló  és gyors
  323.       körrajzoló  módszeren  alapul.  A  körök  tényleg  körök.  A
  324.       hírnevem forog kockán." Ez a módszer tehát nem mûködik. Ez a
  325.       programozási stílus csak akkor funkcionál, ha hozzáférhetô a
  326.       forráskód.
  327.           A következô  probléma: mi  van akkor,  ha ez  a grafikus
  328.       rendszer az  egyik irányítóközpontban,  a központi  amerikai
  329.       hálózati rendszert irányító vezérlôkonzolban található?  Ott
  330.       akarok  egy-két  kisebb  változtatást  végrehajtani,   tehát
  331.       odamegyek,  és  elkérem  a  forráskódot.  Ez  nem  probléma.
  332.       Megcsinálom a változtatást, és megállapítom, hogy nem minden
  333.       sikerült  jól.  ""Oké"  --  mondom  erre  --  ""elvégeztem a
  334.       munkám,   ellenôrizzék   le".   A   problémát   tehát    egy
  335.       szoftverkönyvtáros-félének  kell  átadnom.  ï  így  szól: --
  336.       ""Rendben, el fogjuk végezni az integrálást és a tesztelést.
  337.       Három hét múlva meg fogja kapni az eredményeket."
  338.           A körülményeskedés oka az, hogy hozzá kellett nyúlnom  a
  339.       rendszer összes kulcsfüggvényéhez.  Itt van ugyan  a rajzoló
  340.       függvény,  de  hasonló  változtatásokat  hajtottam  végre  a
  341.       forgató  függvényben és  másutt. Ha  valóban olyan  egyszerû
  342.       lett  volna  a  dolog,  hogy  elég  egy  sokirányú elágazást
  343.       megkeresni,  akkor  aligha  adódott  volna  probléma.  De  a
  344.       programozók ravasz emberek,  a valós kód  nem így néz  ki. A
  345.       programozók  néhány   helyen  bizonyára   észrevettek  közös
  346.       vonásokat a kódon belül. Talán így lehet elôállítani  azonos
  347.       módon a sokszögek különbözô formáit.
  348.           Ahhoz, hogy a rendszerhez hozzáfûzhessek egy új  formát,
  349.       meg kell értenem a régi kódot. Mivel meg kell értenem, ezért
  350.       félre is érthetem. És  ha félreérthetem, akkor fennáll  az a
  351.       veszély,  hogy  megsértem  a  meglévô  és  helyesen   mûködô
  352.       kódokat. Ezért újra szükségünk van egy teljes integrációs és
  353.       regressziós tesztre, ha kritikus kódhoz érünk.
  354.           Az egyszerû  hozzáfûzési feladat  a valóságban  igencsak
  355.       bonyolulttá és hibaérzékennyé vált.
  356.           Tekintsünk vissza, és tûnôdjünk el azon, hogy hol van  e
  357.       problémák gyökere: hol nem követtük eredeti alapelveinket  a
  358.       dolgok közvetlen kifejezésére?
  359.           Akkor,  amikor   definiáltuk  ezeket   a  formákat.   Ha
  360.       alaposabban  meggondoljuk,   a  formáknak   valójában  nincs
  361.       megjelenésük  --  semmilyen   formát  nem  tudunk   magunkra
  362.       rajzolni.
  363.           Csak a meghatározott formáknak van implementációja, csak
  364.       a   meghatározott   formákat   lehet   lerajzolni.  Röviden:
  365.       elfelejtettünk   különbséget  tenni   egy  forma   általános
  366.       koncepciója és valamilyen meghatározott forma között.
  367.           A különbség realizálása érdekében most tehát definiálunk
  368.       egy általános formát, és nem építünk bele semmiféle  variáns
  369.       rekordot  és típusleíró  mezôt. Ugyanis  ez volt  az, ami  a
  370.       nehézségeket okozta.
  371.           Egyszerûen  azt mondjuk:  ""Ez minden,  amit tudunk  egy
  372.       formáról." Kiváltképpen  csak azt  tudjuk, hogy  forgatható,
  373.       hogy  lerajzolható  --  annak  ellenére,  hogy  nem  tudjuk,
  374.       hogyan.  Ezért  egyszerûen  csak  megállapítjuk,  hogy ilyen
  375.       mûveletet  lehet   végezni  rajta.   Csak  késôbb   kell  az
  376.       implementációt elkészítenünk  -- akkor,  amikor már  tudjuk,
  377.       hogy milyen speciális  formáról van szó.  îgy definiálhatunk
  378.       bármilyen különleges formát. Például mondhatjuk azt, hogy  a
  379.       kör egy  olyan formafajta,  amelynek van  sugara, és amelyet
  380.       így meg így lehet forgatni.
  381.           Ezt alaposztálynak nevezzük. Azt  mondjuk, hogy a kör  a
  382.       formából van származtatva, azaz a kör egy formafajta, örökli
  383.       a forma összes  tulajdonságát, és rendelkezésre  bocsájtja a
  384.       ""rotate"  (forgatás)  és  a  ""draw"  (rajzolás)  mûveletek
  385.       önálló   változatait.   Azt  is   mondhatjuk,   hogy  lefedi
  386.       alaposztályának virtuális eljárásait.
  387.           Az   ilyenfajta   programozásnak  van   egy   nagyon  jó
  388.       tulajdonsága: ha a  rendszerhez hozzá akarok  illeszteni egy
  389.       új  formát,  például a  cégemblémát,  akkor egyszerûen  csak
  390.       definiálom a cégemblémát. Aztán  csak beillesztem -- a  régi
  391.       kódokhoz  nem nyúlok  hozzá. Nem  változtatok meg  semmilyen
  392.       kódot, mint az adatabsztrakció esetében.
  393.           Az    adatabsztrakció    --    programozás     sokirányú
  394.       elágazásokkal    --   körülbelül    megfelel   egy    sebész
  395.       orvostudományról  alkotott  elképzelésének:  ""Nem  tehetünk
  396.       semmit anélkül,  hogy elôzetesen  felvágtuk volna  a páciens
  397.       hasát".  Lehet,  hogy  ez jó  a  sebész  erszényének, de  az
  398.       biztos, hogy nem jó a gyomromnak.
  399.           Az  objektumorientált programozás  sok esetben  lehetôvé
  400.       teszi a  változtatásokat a  régi kód  megsértése nélkül. Ezt
  401.       gyakran túlértékelik. Ugyanis ez nem azt jelenti, hogy sosem
  402.       kell módosítani a kódokat. Mégcsak azt sem jelenti, hogy meg
  403.       kellene próbálnunk ezt elkerülni. Pusztán azt jelenti,  hogy
  404.       alkalmas esetben el lehet kerülni.
  405.           ùj  elképzelést  alakítottunk  ki  a  programozásról: az
  406.       ember  eldönti,  hogy  milyen  osztályt  akar,  és  aztán az
  407.       adatabsztrakció esetében szokásos módon definiál egy  teljes
  408.       mûveletsort. A különbség  most a következô:  közös vonásokat
  409.       keresünk  a  típuson  belül,  és  ezeket  közvetlenül,  mint
  410.       osztályokat fejezzük  ki. Ez  koncepciók hierarchiájához  és
  411.       típusok  hierarchiájához  vezet,  és  ahhoz  a  programozási
  412.       stílushoz,   amit   objektumorientáltnak   nevezünk.   Talán
  413.       intellektusunkkal  meg  tudjuk  érteni,  hogy  ez   mûködik.
  414.       Azonban,  hogy lássuk,  valójában milyen  hasznos, ahhoz  ki
  415.       kell próbálni,  és hozzá  kell szokni.  Sok területen  nincs
  416.       jelentôs haszon az  adatabsztrakció technikáival szemben  --
  417.       éppúgy,  miként az  adatabsztrakció sok  területen csak  kis
  418.       hasznot hoz az adatok elrejtéséhez képest. De ha szükség van
  419.       rá,  akkor  valóban  ki  lehet  hozni  belôle  valami klassz
  420.       dolgot.
  421.           Az   objektumorientált   programozás   ígéretei,  amiket
  422.       teljesítünk,  a   következôk:  gyorsabb   programfejlesztés,
  423.       egyszerû    programkezelés     és    a     kódok    nagyfokú
  424.       újrafelhasználhatósága.  Röviden:  gyorsabban   készíthetünk
  425.       jobb  programokat.  Azonban  ehhez  csak  egy  jól átgondolt
  426.       osztály-terv alapján juthatunk el -- ne várjanak csodára.  A
  427.       kód  egyszerûbb  lesz,  könnyebb  lesz  a  kód  kezelése, de
  428.       lesznek olyan tervek is, amelyek nem mûködnek. Ha  azonnali,
  429.       90 százalékos vagy még  nagyobb hasznot várunk --  ahogy azt
  430.       egyesek ígérik -- akkor csalódni fogunk.
  431.           A  tapasztalatok alapján  kiderült, hogy  rövid távon  a
  432.       termelékenységbeli és minôségbeli elônyök elég  mérsékeltek.
  433.       Csak másfél-két év elteltével lehet érzékelni a  fenntartási
  434.       költségekre, a hibaszázalékokra és a többi hasonló  dolgokra
  435.       kifejtett hatásokat.
  436.           Vannak, akik  egybôl fejest  ugranak az  újdonságba: már
  437.       elsô projektjükben felhasználják az összes új tulajdonságot.
  438.       A dolog meglepô módon funkcionál. Ha azonban több dolgozóból
  439.       indulunk  ki,  olyan  emberekbôl, akik  nem  túl  biztosak a
  440.       dolgukban,  akkor  nem  ez   a  helyes  eljárás.  Nem   kell
  441.       szükségszerûen így tenni.
  442.           Egy-másfél évig fog  tartani, mire otthon  fogjuk érezni
  443.       magunkat  minden  technikában,  fogásban.  Mindegy,   hogyan
  444.       kezdünk hozzá, ennyi ideig fog tartani. Emiatt éppolyan  jó,
  445.       ha fokozatosan fogunk hozzá.
  446.  
  447.  
  448.       @VFélreértések@N
  449.  
  450.           Most  szeretnék  állást   foglalni  egy  sor   elterjedt
  451.       félreértésben.
  452.           A C++ nem Smalltalk. Vannak, akik ezt sajnálják. Azonban
  453.       ha  egy  Smalltalk-utánzatot akartam  volna  tervezni, akkor
  454.       sokkal jobbat  készítettem volna.  A C++  egészen más  nyelv
  455.       mint  a  Smalltalk,  szigorúan  tipizált,  a   hatékonyságot
  456.       célozza  meg,   és  összhangban   van  a   más  nyelven  írt
  457.       programokkal.
  458.           Nem     hiszem,     hogy     bármiféle     igény     van
  459.       Smalltalk-utánzatokra.  Sajnos  ezt  sokan  félreértik  azok
  460.       közül,  akik folyóiratokba  írnak cikkeket,  és akik  a  két
  461.       nyelv  közül  csak  az egyikhez  vagy  egyikhez  sem értenek
  462.       igazán -- s nagyon összezavarják a dolgokat.
  463.           A C++-nak része majdnem  a teljes C. Alapvetôen  mindent
  464.       átvett  a C-tôl,  amit típusbiztos  módon részhalmazként  le
  465.       lehet  írni. De  ez nem  minden. Ha  a C++-t  ""tökéletesebb
  466.       C"-ként  alkalmazzuk,  akkor néhány  --  de nem  túl  sok --
  467.       elônyre teszünk  szert az  ANSI szabványú  C-vel szemben. Az
  468.       ANSI  C amúgy  is inkább  a C++  részhalmaza, mint  a  K&R-C
  469.       fôhalmaza. Ugyanis az ANSI C fontos nyelvi jegyei a  C++-ból
  470.       származnak: a prototípusokat és a ""const"-ot a C++ adta. Az
  471.       a furcsa eset állt elô, hogy egy nyelv az utódjától vett  át
  472.       tulajdonságokat. Ami  az öröklést  illeti, az  már nem ilyen
  473.       egyszerû.
  474.           Egy  további  félreértés  abból  adódik,  hogy  a  C++-t
  475.       elôprocesszornak tartják.  A C++  egy nyelv.  És mivel olyan
  476.       nyelv,    amely    döntôen   függ    a    fordítás   közbeni
  477.       típusellenôrzésektôl,  a   statikus  típusrendszerektôl,   a
  478.       láthatósági  szabályoktól  és hasonló  dolgoktól,  ezért nem
  479.       implementálhatja olyasmi, amit hagyományos elôprocesszorként
  480.       lehetne  leírni.  Minden  C++  fordítóprogramnak  (compiler)
  481.       többet  kell  tudnia  a  programról,  mint  amennyit  egy  C
  482.       compiler  egyáltalán  tudhat.  Ennek  megfelelôen  egy   C++
  483.       compiler bonyolultabb és okosabb mint egy C compiler.
  484.           Sok   ember   összezavartságának   az   az   oka,   hogy
  485.       összekeverik a koncepciót annak implementációjával. Sokáig a
  486.       C++  egyetlen  implementációja  egy  általam  írt, általában
  487.       @KC-Front@N-nak  nevezett  compiler  volt,  amely hordozhatósági
  488.       okok  miatt  C  forráskódot  állított  elô.  De  mit csinált
  489.       valójában ez a compiler?  Vett egy C++ programot,  darabokra
  490.       szedte, és teljes mértékben analizálta. Ezen az alapon képes
  491.       volt bármilyen géphez generálni assembly kódot vagy C kódot.
  492.       Mivel  sok ember  sosem látott  olyan C++  fordítóprogramot,
  493.       amely mást hozott volna létre mint C-t, ezért azt gondolták,
  494.       hogy   a   C++  egy   C-elôfeldolgozó   (preprocesszor).  Ez
  495.       elszomorított  engem,  mert   egyáltalán  nem  szeretem   az
  496.       egyszerû elôfeldolgozókat.
  497.           Egy   másik   félreértés  így   szól   (természetesen  e
  498.       félreértések  közül  néhány  kereskedelmi  érdekekbôl   erôs
  499.       támogatást  kap):  a  C++  pusztán  kifinomult tulajdonságok
  500.       véletlenszerû  gyûjteménye.  Azt  hiszem,  érthetôvé  tettem
  501.       azokat  a  kereteket, amelyek  között  mûködôképesek ezek  a
  502.       tulajdonságok. Azt is  hangsúlyoztam, hogy miért  álltunk el
  503.       egy nagy, mindent  átfogó tervtôl. A  következôket gondolom:
  504.       ""Tudjuk,   hogyan  kell   valamit  megépíteni.   Szeretnénk
  505.       megpróbálni,  szeretnénk  látni,  hogy  honnan  származnak a
  506.       valódi   problémák.   És  ha   már   elegendô  tapasztalatot
  507.       szereztünk,  akkor   szeretnénk  beépíteni   a  szükségesnek
  508.       értékelt tulajdonságokat."
  509.           A C++  egyértelmûen alkalmas  arra, hogy  támogasson egy
  510.       szigorúbban tipizált C-változatot, egy ""tökéletesebb  C-t".
  511.       Továbbá arra is alkalmas, hogy támogassa az adatabsztrakciót
  512.       és   az   objektumorientált   programozást.    Természetesen
  513.       assemblyben is lehet  írni objektumorientált programot.  Nem
  514.       ez a lényeg. A kérdés az, hogy a nyelv segít-e nekünk ebben,
  515.       és  nem  kell-e rendkívüli  erôfeszítéseket  és képességeket
  516.       felhasználnunk ahhoz, hogy megbirkózzunk a feladattal. Ebben
  517.       az   értelemben   sürgôsen    azt   tanácsolom,   hogy    ha
  518.       objektumorientáltan akarunk programozni, akkor olyan nyelvet
  519.       használjunk, amely támogatja azt.
  520.           Véleményem  szerint  minden  lényeges  pont  a Simulától
  521.       származik.   A   Simulának  bizonyos   tekintetben   két  fô
  522.       leszármazottja van: a  Smalltalk és a  C++. A kettô  közötti
  523.       különbség   nagyon   fontos  a   két   nyelv  megértése   és
  524.       alkalmazhatósága   szempontjából.   A   Smalltalkot    olyan
  525.       módszernek szánták, amely feloldja a korlátokat a  környezet
  526.       és a programnyelv  között. Ez az  egyik módja annak,  hogy a
  527.       Simulánál rugalmasabbak legyünk.  A Smalltalk ezenkívül  sok
  528.       ötletet  vett  át  a  Lisptôl.  Véleményem  szerint  tehát a
  529.       Smalltalknak két elôdje volt: a Lisp és a Simula.
  530.  
  531.  
  532.       @VA C++ megszületése@N
  533.  
  534.           A   C++-nak    két   szülôje    volt:   a    Simula   az
  535.       osztály-rendszeré,    másrészt     a    C,     amelytôl    a
  536.       rendszerprogramozói  képességet  nyerte.  Azt  hiszem,  hogy
  537.       érdemes elmagyarázni azt a folyamatot, amely ide vezetett.
  538.           A C++ eredete visszanyúlik egy olyan fejlesztésig,  amit
  539.       doktori címem megszerzése érdekében végeztem  Cambridge-ben.
  540.       Megosztott  rendszerek  szimulálásán  dolgoztam.   Simulában
  541.       megírtam egy hálózat szimulációját, felhasználva  hálózatban
  542.       ide-oda  vándorló  modulokat  és  egyebeket.  Valóban   szép
  543.       szimuláció   volt,  sok   örömöm  telt   benne  --   még   a
  544.       hibakeresésben is.  Nagyon megbecsültem  a Simulától  kapott
  545.       segítséget.
  546.           Az osztályok  és a  származtatott osztályok  koncepciója
  547.       valóban lehetôvé  tette számomra  azt, hogy  a gondolataimat
  548.       egyenesen  átültessem  kódokba.  Meglehetôsen  könnyen  ment
  549.       minden. És  amikor két  hónappal késôbb  újra visszatértem a
  550.       kódhoz,  akkor el  tudtam olvasni  -- noha  nem nagyon  volt
  551.       ellátva megjegyzésekkel --  általában így szokott  lenni, ha
  552.       az ember egyedül dolgozik. Tehát úgy vélem, a Simula  nélkül
  553.       nem  találhattam  volna  ki  ezt  a  szimulációt.  A  Simula
  554.       koncepcionális segítséget adott,  és egy szigorúan  tipizált
  555.       rendszert nyújtott, ami  azt jelentette, hogy  a hibakeresés
  556.       során a gép szúrta ki a hibákat, és nem nekem kellett  éjnek
  557.       idején megtalálnom azokat.
  558.           A Simulának  nem volt  úgymond önkényes  típusrendszere.
  559.       Sok évvel ezelôtt, a kezdeti idôkben kipróbáltam a  Pascalt,
  560.       típusrendszere számomra egyszerûen elviselhetetlen kolonc.
  561.           A  Simula szigorúbban  tipizált mint  a Pascal,  de  ezt
  562.       egyáltalán  nem  éreztem tehernek,  mivel  a típusellenôrzés
  563.       azon  koncepció  szintjén  történik,  amelyet  saját kezûleg
  564.       építünk  be  osztályok  formájában.  Már  nem  egy  önkényes
  565.       rendszert  vizsgál,  hanem  azon  keret  szilárdságát, amely
  566.       mellett döntöttünk. És ez nagy segítség volt.
  567.           Szerencsétlen módon azután falnak rohantam. A szimuláció
  568.       elviselhetetlenül  lassan  futott. Az  osztályomon  lévô IBM
  569.       nagyszámítógép  teljes  munkaidejét  lekötöttem.  Nem  sokat
  570.       tehettem. Az  implementáció a  cégé volt,  a Simula átvitele
  571.       egy másik gépre nem volt megvalósítható, mivel természeténél
  572.       fogva nem  volt hordozható  -- egyébként  a forráskóddal sem
  573.       rendelkeztem.  Nem  tudtam megszabadulni  a  nyelvtôl, mivel
  574.       nagyon nehéz volt olyan szoftverrel együttmûködni, amely más
  575.       nyelven íródott.
  576.           A  rendszernek  valóban  szép  jellemvonásai  voltak, és
  577.       akkor is drága volt, ha az ember nem használta. îgy  átírtam
  578.       a  szimulátort  BCPL-be,  és a  hajam  felét  kitéptem, mire
  579.       sikerült az eredménybôl  kiszedegetni a hibákat.  Másrészt a
  580.       BCPL egy új, villámgyors kísérleti gépen futott.
  581.           Megkaptam  az   eredményeimet.  Ez   volt  a   gyakorlat
  582.       tulajdonképpeni célja -- nem az, hogy írjak egy aranyos  kis
  583.       szimulátort.  Néha  elfelejtjük,  hogy  a  programokat   egy
  584.       meghatározott  cél érdekében  írjuk, s  nem öncélúan.  Akkor
  585.       megfogadtam, hogy sosem követem el újra ezt a hibát.
  586.           Az volt a hibám,  hogy elégtelen eszközzel fogtam  hozzá
  587.       egy nagy és súlyos problémához. Néhány évvel késôbb,  amikor
  588.       egy hasonló  fejlesztést kellett  elvégeznem, visszavonultam
  589.       és megterveztem a C++-t.
  590.           @KAz elôadás szövegét németre fordította és szerkesztette:
  591.       Gerhard Ertl@N
  592.  
  593.  
  594.       @VBjarne Stroustrup@N
  595.  
  596.           Bjarne  Stroustrup  fejlesztette ki  a  C++ programozási
  597.       nyelvet, amely lényeges bôvítéseket nyújt elôdjével, a C-vel
  598.       szemben.  Objektumorientált  nyelvként  a  C++  teljesen  új
  599.       típusú  programtervezést   tesz  lehetôvé.   A  dán   kutató
  600.       Aarhusban  tanult  informatikát  és  matematikát,   1979-ben
  601.       doktorált   informatikából   Cambridge-ben.   Fô    kutatási
  602.       területei az osztott rendszerek, az operációs rendszerek,  a
  603.       szimulációk,  a  programozási   nyelvek  és  a   programozás
  604.       módszertana.  1979  óta  az  AT&T  Bell  Laboratories  Murry
  605.       Hillben (USA) lévô mûszaki kutatási központjában dolgozik.
  606.  
  607.  
  608.       @VIrodalom:@N
  609.  
  610.           @VBjarne Stroustrup:@N The  C++ Programming Language  (A C++
  611.       programozási nyelv); Addison-Wesley 1986, 2.kiadás 1991.
  612.           @VTony Hansen:@N  The C++  Answer Book  (Válaszok a C++-szal
  613.       kapcsolatban); Addison-Wesley 1989.
  614.           @VStanley  B.  Lippman:@N   C++  Einführung  und   Leitfaden
  615.       (Bevezetés a C++-ba); Addison-Wesley 1990.
  616.           @VStephen  Dewhurst  és Kathy  Stark:@N  Programming in  C++
  617.       (Programozás C++-ban); Prentice-Hall, Englewood Cliffs,  New
  618.       Jersey, 1989.
  619.           @VBruce  Eckel:@N  Using  C++  (Munka  a  C++-szal); Osborne
  620.       McGraw-Hill 1989.
  621.